﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Util;
using SiGeCoPre.Presupuesto_ViewGeneral;

namespace SiGeCoPre.Presupuesto_ViewAlta
{
    /// <summary>
    /// Formulario de alta de presupuestos de mantenimiento
    /// </summary>
    public partial class frmAltaPresupuestoMantenimiento : Form
    {
        String[] datosProForma = null;
        String formaPago = "";
        String condicionesGenerales = "";
        String ejecucionTrabajo = "";
        int idCliente = 0;
        List<string> tareas = null;
        bool esProForma = false;
        String plazoEntrega = "";
        String tipo = "Mantenimiento";

        BLPresupuestos createPresupuesto = BLFactoryPresupuesto.createPresupuesto();
        BLPresupuestosClientes createPresupuestoCliente = BLFactoryPresupuesto.createPresupuestoClientes();
        BLClientes createCliente = BLFactoryPresupuesto.createCliente();
        BLPresupuestoMantenimiento createPresupuestoMantenimiento = BLFactoryPresupuesto.createPresupuestoMantenimiento();
        BLMantenimiento createMantenimiento = BLFactoryPresupuesto.createMantenimiento();

        public frmAltaPresupuestoMantenimiento()
        {
            InitializeComponent();
        }

        private void frmAltaPresupuestoMantenimiento_Load(object sender, EventArgs e)
        {
            cmbEstado.Text = "Pendiente";
            String[] estados = { "Pendiente", "Aprobado" };
            cmbEstado.Items.AddRange(estados);

            int ultimoId = createPresupuesto.getMaxId();
            int idNuevo = ultimoId + 1;

            //inicio del codigo
            txtCodigo.Text = idNuevo.ToString();
        }

        private void rdProForma_CheckedChanged(object sender, EventArgs e)
        {
            if (rdProForma.Checked)
            {
                btnProForma.Visible = true;
            }
            else
            {
                btnProForma.Visible = false;
            }
        }

        private void btnProForma_Click(object sender, EventArgs e)
        {
            frmProForma proforma = new frmProForma();
            proforma.cargarValores(datosProForma);
            proforma.FormClosed += new FormClosedEventHandler(proforma_FormClosed);
            proforma.Show();
        }

        private void proforma_FormClosed(object sender, FormClosedEventArgs e)
        {
            datosProForma = frmProForma.pasarValores();
            if (null != datosProForma)
            {
                esProForma = true;
            }
        }

        private void btnCondiciones_Click(object sender, EventArgs e)
        {
            frmDetalles condiciones = new frmDetalles();
            condiciones.cargarDetalle(condicionesGenerales);
            condiciones.FormClosed += new FormClosedEventHandler(condiciones_FormClosed);
            condiciones.Show();
        }

        private void condiciones_FormClosed(object sender, FormClosedEventArgs e)
        {
            condicionesGenerales = frmDetalles.pasarDetalle();
        }

        private void btnEjecucion_Click(object sender, EventArgs e)
        {
            frmDetalles ejecucion = new frmDetalles();
            ejecucion.cargarDetalle(ejecucionTrabajo);
            ejecucion.FormClosed += new FormClosedEventHandler(ejecucion_FormClosed);
            ejecucion.Show();
        }

        private void ejecucion_FormClosed(object sender, FormClosedEventArgs e)
        {
            ejecucionTrabajo = frmDetalles.pasarDetalle();
        }

        private void btnFormaPago_Click(object sender, EventArgs e)
        {
            frmDetalles forma = new frmDetalles();
            forma.cargarDetalle(formaPago);
            forma.FormClosed += new FormClosedEventHandler(forma_FormClosed);
            forma.Show();
        }

        private void forma_FormClosed(object sender, FormClosedEventArgs e)
        {
            formaPago = frmDetalles.pasarDetalle();
        }

        private void btnAlta_Click(object sender, EventArgs e)
        {
            try
            {
                 if (verificar())
            {
                //cargar presupuesto
                presupuestosDTO p = new presupuestosDTO();
                p.Activo = true;
                if (null != datosProForma)
                {
                    p.Cif = Convert.ToDouble(datosProForma[0]);
                    p.CodFactura = datosProForma[2];
                    p.Fob = Convert.ToDouble(datosProForma[1]);
                }
                else
                {
                    p.Cif = 0;
                    p.CodFactura = "";
                    p.Fob = 0;
                }
                p.Codigo = txtCodigo.Text;
                p.CondicionesGenerales = condicionesGenerales;
                p.EjecucionTrabajo = ejecucionTrabajo;
                p.EsProforma = esProForma;
                p.Estado = cmbEstado.Text;
                p.Fecha = Convert.ToDateTime(dtpFecha.Text);
                p.FormaPago = formaPago;
                p.PlazoEntrega = plazoEntrega;
                p.Precio = Convert.ToDouble(txtPrecio.Text);
                p.TipoPresupuesto = tipo;
                //guardar presupuesto
                Boolean insertarPresupuesto = createPresupuesto.savePresupuesto(p);
                if (insertarPresupuesto)
                {
                    //cargar presupuesto cliente
                    DataTable clientes = createCliente.getAllClientes();
                    presupuestosClientesDTO pc = new presupuestosClientesDTO();
                    pc.CodigoPresupuesto = txtCodigo.Text;
                    pc.NombreCliente = clientes.Select("id = " + idCliente)[0]["Nombre"].ToString();
                    //guardar presupuesto cliente
                    Boolean insertarPresupuestoCliente = createPresupuestoCliente.savePresupuestoCliente(pc);
                    if (insertarPresupuestoCliente)
                    {
                        //guardar presupuesto mantenimiento
                        presupuestoMantenimientoDTO pm = new presupuestoMantenimientoDTO();
                        pm.CodigoPresupuesto = txtCodigo.Text;
                        pm.Tarea = tareas;
                        pm.EstadoPresupuesto = cmbEstado.Text;
                        List<string> descripcion = new List<string>();

                        foreach (string tarea in tareas)
                        {
                            mantenimientoDTO m = createMantenimiento.getMantenimiento(tarea);
                            descripcion.Add(m.Descripcion);
                        }

                        pm.DescripcionTarea = descripcion;

                        Boolean insertarPresupuestoMantenimiento = createPresupuestoMantenimiento.savePresupuestoMantenimiento(pm);

                        if (insertarPresupuesto && insertarPresupuestoCliente && insertarPresupuestoMantenimiento)
                        {
                           MessageBox.Show("Presupuesto dada de Alta", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                           //exporta archivo
                           string ruta = @"C:\Presupuestos\" + p.Fecha.Year + @"\" + pc.NombreCliente + @"\" + p.Codigo + ".docx";
                           Herramientas.comprobarDirectorio(@"C:\Presupuestos\" + p.Fecha.Year + @"\" + pc.NombreCliente);
                           ExportarMantenimiento.exportar(pm, pc, p, ruta);
                           //envio de mail
                           envioDeMail(cmbEstado.Text, ruta, txtCodigo.Text);

                           this.Close();
                           this.Dispose();
                        }
                        else
                        {
                            MessageBox.Show("Error al intentar dar de Alta!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            Texto.escribirLog("Error en altaPresupuestoMantenimiento");
                        }
                    }
                    else
                    {
                        Texto.escribirLog("Error en altaPresupuestoCliente");
                    }

                }
                else
                {
                    Texto.escribirLog("Error en altaPresupuesto");
                }

              }
            }
            catch (Exception ex)
            {
                Texto.escribirLog(ex.Message);
            }   
        }

        private bool verificar()
        {
            bool verificado = false;
            bool tipoCorrecto = false;
            bool proFormaCorrecta = false;
            bool clienteCorrecto = false;
            bool precioCorrecto = false;
            bool fechaCorrecto = false;
            bool estadoCorrecto = false;
            bool condCorrecta = false;
            bool ejeCorrecta = false;
            bool formaCorrecta = false;
            bool plazoCorrecto = false;

            if (idCliente == 0)
            {
                errorProvider1.SetError(btnCliente, "Cargar Cliente");
            }
            else
            {
                errorProvider1.SetError(btnCliente, string.Empty);
                clienteCorrecto = true;
            }

            if (!Validador.es_decimal(txtPrecio))
            {
                errorProvider1.SetError(txtPrecio, "Formato ##.##");
            }
            else
            {
                errorProvider1.SetError(txtPrecio, string.Empty);
                precioCorrecto = true;
            }

            if (dtpFecha.Text.Equals(""))
            {
                errorProvider1.SetError(dtpFecha, "No puede estar vacio");
            }
            else
            {
                errorProvider1.SetError(dtpFecha, string.Empty);
                fechaCorrecto = true;
            }

            if (!Validador.es_cadena(cmbEstado) || cmbEstado.Text.Trim().Equals(""))
            {
                errorProvider1.SetError(cmbEstado, "Sólo Letras");
            }
            else
            {
                errorProvider1.SetError(cmbEstado, string.Empty);
                estadoCorrecto = true;
            }

            if (rdProForma.Checked)
            {
                if (datosProForma.Equals(""))
                {
                    errorProvider1.SetError(rdProForma, "Cargar Datos");
                }
                else
                {
                    errorProvider1.SetError(rdProForma, string.Empty);
                    proFormaCorrecta = true;
                }
            }
            else
            {
                proFormaCorrecta = true;
            }

            if (null == tareas)
            {
                errorProvider1.SetError(btnTipo, "Cargar Tareas");
            }
            else
            {
                errorProvider1.SetError(btnTipo, string.Empty);
                tipoCorrecto = true;
            }

            if (condicionesGenerales.Equals(""))
            {
                errorProvider1.SetError(btnCondiciones, "Cargar Datos");
            }
            else
            {
                errorProvider1.SetError(btnCondiciones, string.Empty);
                condCorrecta = true;
            }

            if (formaPago.Equals(""))
            {
                errorProvider1.SetError(btnFormaPago, "Cargar Datos");
            }
            else
            {
                errorProvider1.SetError(btnFormaPago, string.Empty);
                formaCorrecta = true;
            }

            if (ejecucionTrabajo.Equals(""))
            {
                errorProvider1.SetError(btnEjecucion, "Cargar Datos");
            }
            else
            {
                errorProvider1.SetError(btnEjecucion, string.Empty);
                ejeCorrecta = true;
            }

            if (plazoEntrega.Equals(""))
            {
                errorProvider1.SetError(btnPlazo, "Cargar Datos");
            }
            else
            {
                errorProvider1.SetError(btnPlazo, string.Empty);
                plazoCorrecto = true;
            }

            if (tipoCorrecto && proFormaCorrecta && clienteCorrecto
                && precioCorrecto && fechaCorrecto && estadoCorrecto
                && condCorrecta && ejeCorrecta && formaCorrecta && plazoCorrecto)
            {
                verificado = true;
            }

            return verificado;

        }

        private void btnTipo_Click(object sender, EventArgs e)
        {
            frmTareas tarea = new frmTareas();
            tarea.cargarTareas(tareas);
            tarea.FormClosed += new FormClosedEventHandler(tarea_FormClosed);
            tarea.Show();
        }

        private void tarea_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (null != frmTareas.pasarTareas())
            {
                tareas = frmTareas.pasarTareas();   
            }
        }

        private void btnCliente_Click(object sender, EventArgs e)
        {
            frmClientes cliente = new frmClientes();
            cliente.FormClosed += new FormClosedEventHandler(cliente_FormClosed);
            cliente.Show();
        }

        private void cliente_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                idCliente = frmClientes.pasarId();
                if (idCliente != 0)
                {
                    DataTable c = createCliente.getAllClientes();
                    string nombre = c.Select("id = " + idCliente)[0]["Nombre"].ToString();
                    //codigo completo
                    txtCodigo.Text = txtCodigo.Text + "-" + nombre + "-Mantenimiento";    
                }
            }
            catch (Exception ex)
            {
                Texto.escribirLog(ex.Message);
            }
        }

        private void btnPlazo_Click(object sender, EventArgs e)
        {
            frmDetalles plazo = new frmDetalles();
            plazo.cargarDetalle(plazoEntrega);
            plazo.FormClosed += new FormClosedEventHandler(plazo_FormClosed);
            plazo.Show();
        }

        private void plazo_FormClosed(object sender, FormClosedEventArgs e)
        {
            plazoEntrega = frmDetalles.pasarDetalle();
        }

        private void envioDeMail(string estado, string ruta, string codigo)
        {
            if (estado.Equals("Pendiente"))
            {
                DialogResult resp = MessageBox.Show("¿Desea enviar el Aviso de Revisión a del Presupuesto?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (resp.Equals(DialogResult.Yes))
                {
                    frmMail mail = new frmMail();
                    string usuario = frmPrincipal.pasarUsuario();
                    mail.cargarDatos(usuario, "Revisión", "", codigo);
                    mail.Show();
                }
            }
            else
            {
                DialogResult resp = MessageBox.Show("¿Desea enviar el Presupuesto al Cliente?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (resp.Equals(DialogResult.Yes))
                {
                    frmMail mail = new frmMail();
                    string usuario = frmPrincipal.pasarUsuario();
                    mail.cargarDatos(usuario, "Envío de Presupuesto", ruta, codigo);
                    mail.Show();
                }
            }
        }

    }
}
